package day38;

// 红与黑
// 广度优先搜索 + 标记走过 + 方向判断

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

// 根据参考：
public class Main1 {
    // 定义结点类
    static class Node {
        int x;
        int y;
        public Node(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }

    public static void main(String[] args) {
        // 第0列全是行，第1列全是列
        int[][] direction = {{1,0},{-1,0},{0,1},{0,-1}};  // 上下左右方向（row，col）
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int row = in.nextInt();
            int col = in.nextInt();
            char[][] titles =new char[row][col];
            // 利用boolean来标记走过的路，以避免重复
            boolean[][] flag = new boolean[row][col];
            // 开始的'@'就算是一个黑
            int count = 1;
            Node start = null;
            // 进行输入以及开始结点的寻找+不可走白色'#'的标记
            for (int i = 0; i < row; i++) {
                // 一行一输入一判断
                String tmp = in.next();
                // 然后对该行的每一列进行判断标记
                for (int j = 0; j < col; j++) {
                    titles[i][j] = tmp.charAt(j);
                    if (titles[i][j] == '@') {
                        start = new Node(i,j); // 存入链表，最后要进行计数
                    }
                    // 将‘#’也视作走过了,'#'代表的是白色（不计数）
                    if(titles[i][j] == '#') {
                        flag[i][j] = true;
                    }
                }
            }
            Queue<Node> queue = new LinkedList<>(); // 记录可走结点（黑色）
            queue.offer(start); // 记录开始位置
            flag[start.x][start.y] = true;   // 开始位置标记为走过
            // 进行链表的遍历以及方向遍历（false才算）
            while (!queue.isEmpty()) {
                Node cur = queue.poll(); // 拿掉头结点
                // 开始进行方向判断:每一个结点都进行四个方向的判断，直到遇到满足条件的就开始进行
                for (int i = 0; i < 4; i++) {
                    Node next = new Node(cur.x+direction[i][0],cur.y+direction[i][1]);
                    // 进行判断：是否走过false + 坐标合法性判断
                    if(next.x>=0 && next.x<row && next.y>=0 && next.y<col && !flag[next.x][next.y]) {
                        count++;
                        flag[next.x][next.y] = true;
                        // 将该结点加入链表中（一定不要忘记！！）
                        queue.offer(next);
                    }
                }
            }
            System.out.println(count);
        }
    }
}
